* Made variant tabs hidden on special pages (has no or sometimes wrong/inconsistent effect there; plus it's mainly in the user language)
* Made redirects be in content language again (remove from Title->getPageLanguage())
* Conversion script between Tifinagh and Latin for the Tachelhit language
* (bug 16755) Add options 'noreplace' and 'noerror' to {{DEFAULTSORT:...}}
to stop it from replace an already existing default sort, and suppress error.
+* (bug 30364) LanguageConverter now depends on the page content language
+ instead of the wiki content language
=== Bug fixes in 1.19 ===
* $wgUploadNavigationUrl should be used for file redlinks if
* @return string containing HMTL with redirect link
*/
public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
- global $wgOut, $wgLang, $wgStylePath;
+ global $wgOut, $wgStylePath;
if ( !is_array( $target ) ) {
$target = array( $target );
}
- $imageDir = $wgLang->getDir();
+ $lang = $this->getTitle()->getPageLanguage();
+ $imageDir = $lang->getDir();
if ( $appendSubtitle ) {
$wgOut->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
}
$nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
- $alt = $wgLang->isRTL() ? '←' : '→';
+ $alt = $lang->isRTL() ? '←' : '→';
// Automatically append redirect=no to each link, since most of them are redirect pages themselves.
foreach ( $target as $rt ) {
$link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
* /w/index.php?title=Main_page&variant=zh-cn should never be served.
*/
function addAcceptLanguage() {
- global $wgContLang;
- if( !$this->getRequest()->getCheck( 'variant' ) && $wgContLang->hasVariants() ) {
- $variants = $wgContLang->getVariants();
+ $lang = $this->getTitle()->getPageLanguage();
+ if( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
+ $variants = $lang->getVariants();
$aloption = array();
foreach ( $variants as $variant ) {
- if( $variant === $wgContLang->getCode() ) {
+ if( $variant === $lang->getCode() ) {
continue;
} else {
$aloption[] = 'string-contains=' . $variant;
* have to be purged on configuration changes.
*/
protected function getJSVars() {
- global $wgUseAjax, $wgEnableMWSuggest, $wgContLang;
+ global $wgUseAjax, $wgEnableMWSuggest;
$title = $this->getTitle();
$ns = $title->getNamespace();
'wgCategories' => $this->getCategories(),
'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
);
- if ( $wgContLang->hasVariants() ) {
- $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
+ $lang = $this->getTitle()->getPageLanguage();
+ if ( $lang->hasVariants() ) {
+ $vars['wgUserVariant'] = $lang->getPreferredVariant();
}
foreach ( $title->getRestrictionTypes() as $type ) {
$vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
$wgSitename, $wgVersion, $wgHtml5, $wgMimeType,
$wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
- $wgDisableLangConversion, $wgCanonicalLanguageLinks, $wgContLang,
+ $wgDisableLangConversion, $wgCanonicalLanguageLinks,
$wgRightsPage, $wgRightsUrl;
$tags = array();
) );
}
+ $lang = $this->getTitle()->getPageLanguage();
+
# Language variants
if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks
- && $wgContLang->hasVariants() ) {
+ && $lang->hasVariants() ) {
- $urlvar = $wgContLang->getURLVariant();
+ $urlvar = $lang->getURLVariant();
if ( !$urlvar ) {
- $variants = $wgContLang->getVariants();
+ $variants = $lang->getVariants();
foreach ( $variants as $_v ) {
$tags[] = Html::element( 'link', array(
'rel' => 'alternate',
$s = '';
/* show links to different language variants */
- global $wgDisableLangConversion, $wgLang, $wgContLang;
+ global $wgDisableLangConversion, $wgLang;
- $variants = $wgContLang->getVariants();
+ $lang = $this->getSkin()->getTitle()->getPageLanguage();
+ $variants = $lang->getVariants();
if ( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) {
foreach ( $variants as $code ) {
- $varname = $wgContLang->getVariantname( $code );
+ $varname = $lang->getVariantname( $code );
if ( $varname == 'disable' ) {
continue;
array( &$this, &$content_navigation ) );
}
+ $pageLang = $title->getPageLanguage();
+
// Gets list of language variants
- $variants = $wgContLang->getVariants();
+ $variants = $pageLang->getVariants();
// Checks that language conversion is enabled and variants exist
- if( !$wgDisableLangConversion && count( $variants ) > 1 ) {
- // Gets preferred variant
- $preferred = $wgContLang->getPreferredVariant();
+ // And if it is not in the special namespace
+ if( !$wgDisableLangConversion && count( $variants ) > 1
+ && $title->getNamespace() != NS_SPECIAL ) {
+ // Gets preferred variant (note that user preference is
+ // only possible for wiki content language variant)
+ $preferred = $pageLang->getPreferredVariant();
// Loops over each variant
foreach( $variants as $code ) {
// Gets variant name from language code
- $varname = $wgContLang->getVariantname( $code );
+ $varname = $pageLang->getVariantname( $code );
// Checks if the variant is marked as disabled
if( $varname == 'disable' ) {
// Skips this variant
*/
public function getLocalURL( $query = '', $variant = false ) {
global $wgArticlePath, $wgScript, $wgServer, $wgRequest;
- global $wgVariantArticlePath, $wgContLang;
+ global $wgVariantArticlePath;
if ( is_array( $query ) ) {
$query = wfArrayToCGI( $query );
} else {
$dbkey = wfUrlencode( $this->getPrefixedDBkey() );
if ( $query == '' ) {
- if ( $variant != false && $wgContLang->hasVariants() ) {
+ if ( $variant != false && $this->getPageLanguage()->hasVariants() ) {
if ( !$wgVariantArticlePath ) {
$variantArticlePath = "$wgScript?title=$1&variant=$2"; // default
} else {
if ( $this->getNamespace() == NS_SPECIAL ) {
// special pages are in the user language
return $wgLang;
- } elseif ( $this->isRedirect() ) {
- // the arrow on a redirect page is aligned according to the user language
- return $wgLang;
} elseif ( $this->isCssOrJsPage() ) {
// css/js should always be LTR and is, in fact, English
return wfGetLangObj( 'en' );
* @return mixed ParserOptions object or boolean false
*/
public function getParserOptions( $canonical = false ) {
- global $wgUser, $wgLanguageCode;
+ global $wgUser;
if ( !$this->mParserOptions || $canonical ) {
$user = !$canonical ? $wgUser : new User;
$parserOptions->enableLimitReport();
if ( $canonical ) {
- $parserOptions->setUserLang( $wgLanguageCode ); # Must be set explicitely
+ $parserOptions->setUserLang( $this->mTitle->getPageLanguage() ); # Must be set explicitely
return $parserOptions;
}
$this->mParserOptions = $parserOptions;
* to internalParse() which does all the real work.
*/
- global $wgUseTidy, $wgAlwaysUseTidy, $wgContLang, $wgDisableLangConversion, $wgDisableTitleConversion;
+ global $wgUseTidy, $wgAlwaysUseTidy, $wgDisableLangConversion, $wgDisableTitleConversion;
$fname = __METHOD__.'-' . wfGetCaller();
wfProfileIn( __METHOD__ );
wfProfileIn( $fname );
# The position of the convert() call should not be changed. it
# assumes that the links are all replaced and the only thing left
# is the <nowiki> mark.
-
- $text = $wgContLang->convert( $text );
+ $text = $this->getFunctionLang()->convert( $text );
}
/**
|| isset( $this->mDoubleUnderscores['notitleconvert'] )
|| $this->mOutput->getDisplayTitle() !== false ) )
{
- $convruletitle = $wgContLang->getConvRuleTitle();
+ $convruletitle = $this->getFunctionLang()->getConvRuleTitle();
if ( $convruletitle ) {
$this->mOutput->setTitleText( $convruletitle );
} else {
- $titleText = $wgContLang->convertTitle( $title );
+ $titleText = $this->getFunctionLang()->convertTitle( $title );
$this->mOutput->setTitleText( $titleText );
}
}
* @private
*/
function makeFreeExternalLink( $url ) {
- global $wgContLang;
wfProfileIn( __METHOD__ );
$trail = '';
$text = $this->maybeMakeExternalImage( $url );
if ( $text === false ) {
# Not an image, make a link
- $text = Linker::makeExternalLink( $url, $wgContLang->markNoConversion($url), true, 'free',
+ $text = Linker::makeExternalLink( $url, $this->getFunctionLang()->markNoConversion($url), true, 'free',
$this->getExternalLinkAttribs( $url ) );
# Register it in the output object...
# Replace unnecessary URL escape codes with their equivalent characters
* @return string
*/
function replaceExternalLinks( $text ) {
- global $wgContLang;
wfProfileIn( __METHOD__ );
$bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
list( $dtrail, $trail ) = Linker::splitTrail( $trail );
}
- $text = $wgContLang->markNoConversion( $text );
+ $text = $this->getFunctionLang()->markNoConversion( $text );
$url = Sanitizer::cleanUrl( $url );
* @private
*/
function replaceInternalLinks2( &$s ) {
- global $wgContLang;
-
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__.'-setup' );
$line = $a->current(); # Workaround for broken ArrayIterator::next() that returns "void"
$s = substr( $s, 1 );
- $useLinkPrefixExtension = $wgContLang->linkPrefixExtension();
+ $useLinkPrefixExtension = $this->getFunctionLang()->linkPrefixExtension();
$e2 = null;
if ( $useLinkPrefixExtension ) {
# Match the end of a line for a word that's not followed by whitespace,
$prefix = '';
}
- if ( $wgContLang->hasVariants() ) {
- $selflink = $wgContLang->autoConvertToAllVariants( $this->mTitle->getPrefixedText() );
+ if ( $this->getFunctionLang()->hasVariants() ) {
+ $selflink = $this->getFunctionLang()->autoConvertToAllVariants( $this->mTitle->getPrefixedText() );
} else {
$selflink = array( $this->mTitle->getPrefixedText() );
}
# Link not escaped by : , create the various objects
if ( $noforce ) {
+ global $wgContLang;
# Interwikis
wfProfileIn( __METHOD__."-interwiki" );
}
$sortkey = Sanitizer::decodeCharReferences( $sortkey );
$sortkey = str_replace( "\n", '', $sortkey );
- $sortkey = $wgContLang->convertCategoryKey( $sortkey );
+ $sortkey = $this->getFunctionLang()->convertCategoryKey( $sortkey );
$this->mOutput->addCategory( $nt->getDBkey(), $sortkey );
/**
$function = $this->mFunctionSynonyms[1][$function];
} else {
# Case insensitive functions
- $function = $wgContLang->lc( $function );
+ $function = $this->getFunctionLang()->lc( $function );
if ( isset( $this->mFunctionSynonyms[0][$function] ) ) {
$function = $this->mFunctionSynonyms[0][$function];
} else {
}
$titleText = $title->getPrefixedText();
# Check for language variants if the template is not found
- if ( $wgContLang->hasVariants() && $title->getArticleID() == 0 ) {
- $wgContLang->findVariantLink( $part1, $title, true );
+ if ( $this->getFunctionLang()->hasVariants() && $title->getArticleID() == 0 ) {
+ $this->getFunctionLang()->findVariantLink( $part1, $title, true );
}
# Do recursion depth check
$limit = $this->mOptions->getMaxTemplateDepth();
*/
function getETag( $article, $popts ) {
return 'W/"' . $this->getParserOutputKey( $article,
- $popts->optionsHash( ParserOptions::legacyOptions() ) ) .
+ $popts->optionsHash( ParserOptions::legacyOptions(), $article->getTitle() ) ) .
"--" . $article->getTouched() . '"';
}
$usedOptions = ParserOptions::legacyOptions();
}
- return $this->getParserOutputKey( $article, $popts->optionsHash( $usedOptions ) );
+ return $this->getParserOutputKey( $article, $popts->optionsHash( $usedOptions, $article->getTitle() ) );
}
/**
$value = $this->mMemc->get( $parserOutputKey );
if ( self::try116cache && !$value && strpos( $value, '*' ) !== -1 ) {
wfDebug( "New format parser cache miss.\n" );
- $parserOutputKey = $this->getParserOutputKey( $article, $popts->optionsHash( ParserOptions::legacyOptions() ) );
+ $parserOutputKey = $this->getParserOutputKey( $article,
+ $popts->optionsHash( ParserOptions::legacyOptions(), $article->getTitle() ) );
$value = $this->mMemc->get( $parserOutputKey );
}
if ( !$value ) {
$optionsKey->setContainsOldMagic( $parserOutput->containsOldMagic() );
$parserOutputKey = $this->getParserOutputKey( $article,
- $popts->optionsHash( $optionsKey->mUsedOptions ) );
+ $popts->optionsHash( $optionsKey->mUsedOptions, $article->getTitle() ) );
// Save the timestamp so that we don't have to load the revision row on view
$parserOutput->mTimestamp = $article->getTimestamp();
* settings.
*
* @since 1.17
+ * @param $forOptions Array
+ * @param $title Title: used to get the content language of the page
* @return \string Page rendering hash
*/
- public function optionsHash( $forOptions ) {
- global $wgContLang, $wgRenderHashAppend;
+ public function optionsHash( $forOptions, $title = null ) {
+ global $wgRenderHashAppend, $wgTitle;
$confstr = '';
// add in language specific options, if any
// @todo FIXME: This is just a way of retrieving the url/user preferred variant
- $confstr .= $wgContLang->getExtraHashOptions();
+ if( !is_null( $title ) ) {
+ $confstr .= $title->getPageLanguage()->getExtraHashOptions();
+ } else {
+ global $wgContLang;
+ $confstr .= $wgContLang->getExtraHashOptions();
+ }
$confstr .= $wgRenderHashAppend;
// not memoized (i.e. there return value is not cached) since
// new information might appear during processing after this
// is first called.
- if ( $req ) {
+ if ( $req = $this->validateVariant( $req ) ) {
return $req;
}
return $this->mMainLanguageCode;